/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import model.Fornecedor;
import model.Produto;
import utils.Conexao;
import utils.ExcecaoSCEV;
/**
 *
 * @author Usuario
 */
public class ProdutoDAO {
     public List<Produto> pegarTodos() throws ExcecaoSCEV {
        List<Produto> Produtos = new ArrayList<Produto>();
        Produto umProduto;
        Fornecedor umFornecedor;
        DAOFactory daoFactory = new DAOFactory();
        FornecedorDAO fornecedorDAO = daoFactory.getFornecedorDAO();

        try {
            Connection db = Conexao.getConnection();
            Statement st = (Statement) db.createStatement();
            ResultSet rs = st.executeQuery(
                "SELECT  cod_produto,descricao,album,genero,tipo,preco,precocusto,quantidade,cod_fornecedor FROM produto");
            while (rs.next()) {
                umProduto = new Produto();
                umProduto.setCodigoProduto(rs.getInt(1));
                umProduto.setDescricao(rs.getString(2));
                umProduto.setAlbum(rs.getString(3));
                umProduto.setGenero(rs.getString(4));
                umProduto.setTipo(rs.getString(5));
                umProduto.setPreco(rs.getString(6));
                umProduto.setPrecoCusto(rs.getString(7));
                umProduto.setQuantidade(rs.getInt(8));
                umFornecedor = new Fornecedor();
                umFornecedor.setCodigoFornecedor(rs.getInt(9));
                fornecedorDAO.carregar(umFornecedor);
                umProduto.setFornecedor(umFornecedor);
                Produtos.add(umProduto);


            }
            rs.close();
            st.close();

        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro ao listar os Produtos. Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
        }
        return Produtos;
    }




    public void incluir(Produto Produto) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                db.prepareStatement("insert into produto ("+
                "cod_produto,descricao,album,genero,tipo,preco,precocusto,quantidade,cod_fornecedor) values (?,?,?,?,?,?,?,?,?)");

            st.setInt(1, Produto.getCodigoProduto());
            st.setString(2, Produto.getDescricao());
            st.setString(3, Produto.getAlbum());
            st.setString(4, Produto.getGenero());
            st.setString(5, Produto.getTipo());
            st.setString(6, Produto.getPreco());
            st.setString(7, Produto.getPrecoCusto());
            st.setInt(8, Produto.getQuantidade());
            st.setInt(9, Produto.getFornecedor().getCodigoFornecedor());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            if (ex.getSQLState().equals("23505")) {
                throw new ExcecaoSCEV("Produto duplicado.");
            } else {
                throw new ExcecaoSCEV("Erro na inclusão do Produto. Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }

    }

    public void alterar(Produto Produto) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement(
"update produto set cod_produto=?, descricao=?, album=?, genero=?, tipo=?, preco=?,precocusto=?, quantidade=?,cod_fornecedor=? where cod_produto=?");

            st.setInt(1, Produto.getCodigoProduto());
            st.setString(2, Produto.getDescricao());
            st.setString(3, Produto.getAlbum());
            st.setString(4, Produto.getGenero());
            st.setString(5, Produto.getTipo());
            st.setString(6, Produto.getPreco());
            st.setString(7, Produto.getPreco());
            st.setInt(8, Produto.getQuantidade());
            st.setInt(9, Produto.getFornecedor().getCodigoFornecedor());
            st.setInt(10, Produto.getCodigoProduto());

            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro na alteração do Produto.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
        }
    }
    public static void alterarQuantidade(Integer cod_produto, Integer quantidade) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st = db.prepareStatement("update produto set quantidade=quantidade-? where cod_produto =?");
            st.setInt(1, quantidade);
            st.setInt(2, cod_produto);
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro na alteração do Produto.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
        }
    }

    public void excluir(Produto Produto) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("delete from Produto where cod_produto = ? ");
            st.setInt(1, Produto.getCodigoProduto());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
           if (ex.getSQLState().equals("23503")) {
                throw new ExcecaoSCEV("Produto possuído por alguma disciplina ou aluno.");
            }   else{
                   throw new ExcecaoSCEV("Erro na exclusão do Produto.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }
    }

    public void carregar(Produto Produto) throws ExcecaoSCEV {
     Fornecedor umFornecedor;
        DAOFactory daoFactory = new DAOFactory();
        FornecedorDAO fornecedorDAO = daoFactory.getFornecedorDAO();
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                db.prepareStatement("SELECT cod_produto,descricao,album,genero,tipo,preco,precocusto,quantidade,cod_fornecedor FROM Produto where cod_produto = ?");
                st.setInt(1, Produto.getCodigoProduto());
                ResultSet rs = st.executeQuery();

                if (rs.next()) {
                    Produto.setCodigoProduto(rs.getInt(1));
                    Produto.setDescricao(rs.getString(2));
                    Produto.setAlbum(rs.getString(3));
                    Produto.setGenero(rs.getString(4));
                    Produto.setTipo(rs.getString(5));
                    Produto.setPreco(rs.getString(6));
                    Produto.setPrecoCusto(rs.getString(7));
                    Produto.setQuantidade(rs.getInt(8));
                    umFornecedor = new Fornecedor();
                    umFornecedor.setCodigoFornecedor(rs.getInt(9));
                    fornecedorDAO.carregar(umFornecedor);
                    Produto.setFornecedor(umFornecedor);
                }
            rs.close();

        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro ao carregar um Produto. Código " + ex.getSQLState() +
                    "\nDescricao "  + ex.getMessage());
        }

    }

}
